
package listmapdemo;

import listmapdemo.product;

import java.util.*;
import java.util.stream.Collectors;

public class DataStatistics {
    // 记录商品购买次数
    private Map<product, Integer> purchaseCount = new HashMap<>();

    // 记录商品分类销量
    private Map<Double, Integer> categorySales = new HashMap<>();

    // 记录价格区间统计
    private NavigableMap<Double, Integer> priceRangeStats = new TreeMap<>();

    // 更新统计数据
    public void updateStatistics(Map<product, Integer> items) {
        for (Map.Entry<product, Integer> entry : items.entrySet()) {
            product product = entry.getKey();
            int quantity = entry.getValue();

            // 更新商品购买次数
            purchaseCount.put(product, purchaseCount.getOrDefault(product, 0) + quantity);

            // 更新商品分类销量
            categorySales.put(product.category, categorySales.getOrDefault(product.category, 0) + quantity);

            // 更新价格区间统计
            double price = product.price;
            // 找到最接近的价格下限
            Double floorKey = priceRangeStats.floorKey(price);
            if (floorKey != null) {
                priceRangeStats.put(floorKey, priceRangeStats.get(floorKey) + quantity);
            } else {
                // 如果没有找到合适的价格区间，创建一个新的区间
                priceRangeStats.put(price, quantity);
            }
        }
    }

    // 获取最受欢迎商品（购买次数最多）
    public List<Map.Entry<product, Integer>> getMostPopularProducts(int topN) {
        return purchaseCount.entrySet().stream()
                .sorted(Map.Entry.<product, Integer>comparingByValue().reversed())
                .limit(topN)
                .collect(Collectors.toList());
    }

    // 按商品分类统计销量
    public Map<Double, Integer> getCategorySales() {
        return Collections.unmodifiableMap(categorySales);
    }

    // 按价格区间统计商品数量
    public NavigableMap<Double, Integer> getPriceRangeStatistics() {
        return Collections.unmodifiableNavigableMap(priceRangeStats);
    }

    // 初始化价格区间（可以根据需要调用）
    public void initializePriceRanges(List<Double> priceBounds) {
        priceRangeStats.clear();
        for (Double priceBound : priceBounds) {
            priceRangeStats.put(priceBound, 0);
        }
    }
}
